/*
 * TacticaB.java
 *
 * Created on 26 de abril de 2007, 17:02
 * 
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.SerieC;

import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
import java.lang.*;

/**
 *
 * @author Borja Guilln Martnez, Madrid
 * 
 */
public class TacticaB implements Tactica {
    
    private int nValores[][]={
        {-150,0,7},  // Jugador 1[0]
        {-100,-100,7},  // Jugador 2[1]
        {-100,100,7},  // Jugador 3[2]
        {-40,40,6},  // Jugador 4[3]
        {-40,-40,6},  // Jugador 5[4]
        {-60,0,4},  // Jugador 6[5]
        {50,-60,4},  // Jugador 7[6]
        {50,60,4},  // Jugador 8[7]
        {70,0,6},  // Jugador 9[8]
        {100,-40,6},  // Jugador 10[9]
        {100,40,6}  // Jugador 11[10]
     };
      public Color getColor1() {
        return Color.black;
    }

    public Color getColor2() {
        return Color.LIGHT_GRAY;
    }

    public Color getColorNumero() {
        return Color.white;
    }

    public String getNombre() {
        return "SerieC";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }
     public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        
        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
         
        
         //Movimiento portero
        
        
        int y=(int)(bola.getY()/2);
        if (y<-20) y=-20;
        if (y>20) y=20;
        
        //el portero que pase
        int jugadoraPasar=this.mejorPase(0,sj);
                if (jugadoraPasar!=-1) com.add(new ComandoPase(0,jugadoraPasar));
        com.add(new ComandoIrA(0,nValores[0][0], y));
        //desplazamiento del portero
        if (bola.y <-40 && !sj.estoyMasCercaDeBola()) com.add(new ComandoIrA(0,nValores[0][0], -30));
        if (bola.y >40 && !sj.estoyMasCercaDeBola()) com.add(new ComandoIrA(0,nValores[0][0], 30));
        
        
        //el resto que tire a puerta si no se le indica lo contrario
       for (int n=1;n<11;n++){ com.add(new ComandoTiroAPuerta(n,0));}
        
        
        // Zona defensiva
        if (bola.getX()<=-60){
        
            com.add(new ComandoIrA(1,-110, -20));
            com.add(new ComandoIrA(2,-110, 20));
            com.add(new ComandoIrA(3,-40, 40));
            com.add(new ComandoIrA(4,-40, -40));
            com.add(new ComandoIrA(5,-60, 0));
            com.add(new ComandoIrA(6,50, -60));
            com.add(new ComandoIrA(7,50, 60));
            com.add(new ComandoIrA(8,70, 0));
            com.add(new ComandoIrA(9,100, -40));
            com.add(new ComandoIrA(10,100, 40));  
            
            
            //TODO El 5 se mueve a la par que el 3 pero un poco mas adelantado sin salirse del campo
        
        }
        
        // Zona Media
        
        if (bola.getX()>-60 && bola.getX()<60){
        
            com.add(new ComandoIrA(1,-70, -50));
            com.add(new ComandoIrA(2,-70, 50));
            com.add(new ComandoIrA(3,-30, 30));
            com.add(new ComandoIrA(4,-30, -30));
            com.add(new ComandoIrA(5,-10, 0));
            com.add(new ComandoIrA(6,30, -60));
            com.add(new ComandoIrA(7,30, 60));
            com.add(new ComandoIrA(8,50, 0));
            com.add(new ComandoIrA(9,80, -30));
            com.add(new ComandoIrA(10,80, 30));
            
            
            //los centrales que realicen pases
            for (int n=0;n<11;n++){ 
                jugadoraPasar=this.mejorPase(n,sj);
                if (jugadoraPasar!=-1)
                com.add(new ComandoPase(n,jugadoraPasar));}
        
        }
        
        // Zona de Ataque
        else if (bola.getX()>=60){
        
            com.add(new ComandoIrA(1,-100, -50));
            com.add(new ComandoIrA(2,-100, 50));
            com.add(new ComandoIrA(3,-40, 40));
            com.add(new ComandoIrA(4,-40, -40));
            com.add(new ComandoIrA(5,-60, 0));
            com.add(new ComandoIrA(6,50, -60));
            com.add(new ComandoIrA(7,50, 60));
            com.add(new ComandoIrA(8,70, 0));
            com.add(new ComandoIrA(9,100, -40));
            com.add(new ComandoIrA(10,100, 40));  
        
        }
        
               
       //Movimiento mas cercano a la bola
        
        int nJug=(int)sj.getMasCercanoDeBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        
        return com;
    }
     
private int mejorPase(int i,SituacionJugadores sj){
    
    int salida= -1;
    
    Point contrarios[]=sj.getContrario();
    Point jugadores[]=sj.getMisJugadores();
    Point jugador=jugadores[i];
    int jugadoraPasar=10;
    
    //Para cada uno de los posibles jugadores a los que puedo pasar (delante de mi o muy cerca por detras) compruebo cual esta ms libre.(notar que esto puede provocar que se pasen uno a otro hasta que cambie la situacion)
    double mejorDistacia=600;
    for(int m=1;m<11;m++){  
          
    //el jugador que esta ms cerca de nosotros:
          int mascercano=sj.getMiJugadorMasCerca(jugador.x,jugador.y);
          double mejorDistanciaParcial=600;
          for (int n=0;n<11;n++) {

            if ((jugadores[m].x > jugador.x)||(jugador.x-jugadores[m].x<10)){
          
                java.awt.geom.Line2D.Double recta= new java.awt.geom.Line2D.Double(jugador,jugadores[m]); 
                double distanciaActual=recta.ptSegDist(contrarios[n]);
                if (mejorDistanciaParcial>distanciaActual){
                    mejorDistanciaParcial=distanciaActual;
                    
                    if (mejorDistanciaParcial<mejorDistacia){
                            jugadoraPasar=m;
                    
                         }
            
                    }
                }
            }

         }
    
         salida=jugadoraPasar;
    
    
    
     
    return salida;

}
    
    
    
    /** Creates a new instance of TacticaB */
    public TacticaB() {
    }
    
}
